
/**
 * 1、scala中的class不定义main方法，可以在object里定义main方法，作为启动入口
 * 2、val修饰的变量，值不能改变。var修饰的变量，值可以改变
 */
object homework1 {


  /**
   * 1、启动入口
   * @param args
   */
  def main(args: Array[String]): Unit = {
    // 出家人不讲钱，只讲元，这里有100元
    val count = drink(100)
    println(s"一共喝了${count}瓶啤酒")
  }

  /**
   * 1、Java中定义方法，scala定义函数
   * 2、scala的变量类型统一后置，使用 : 来进行连接
   * 3、与Java不同，函数体中最后一句为返回值的话，可以将return去掉
   * @param money
   * @return
   */
  def drink(money: Int): Int = {
    // 2元一瓶啤酒，本质就是50瓶啤酒可以再喝多少瓶
    val num = money / 2
    // 计算50瓶啤酒可以换多少啤酒
    val swapNum = swap(num)
    /**
     * s 插值器，对内嵌的每个表达式求值，对求值结果调用toString，替换掉字面量中的那些表达式
     */
    println(s"最终瓶盖和空瓶一共换了${swapNum}瓶啤酒")
    // 省略了return
    num + swapNum
  }

  // 剩余空瓶数
  var kpNum = 0
  // 剩余瓶盖数
  var pgNum = 0

  /**
   * 1、计算买N瓶啤酒一共可以换多少瓶啤酒
   * 2、是个递归，本质没有不一样，注意scala语言的写法就可以
   * @param beerNum 啤酒数
   * @return
   */
  def swap(beerNum: Int): Int = {
    // 当前剩空瓶数
    kpNum += beerNum
    // 当前剩余空瓶盖数
    pgNum += beerNum
    println(s"1、当前啤酒数$beerNum，剩余空瓶数$kpNum,剩余瓶盖数$pgNum")
    // 如果当前剩余的空瓶数和空瓶盖数不足以更换一瓶啤酒
    if (kpNum < 3 && pgNum < 5) return 0
    // 空瓶可以更换的啤酒
    var kpSwap = 0
    // 瓶盖可以更换的啤酒
    var pgSwap = 0
    if (kpNum >= 3) {
      // 空瓶可以换的啤酒数
      kpSwap = kpNum / 3
      // 换完后剩余空瓶数
      kpNum = kpNum % 3
    }
    if (pgNum >= 5) {
      // 瓶盖可以换的啤酒数
      pgSwap = pgNum / 5
      // 换完后剩余瓶盖数
      pgNum = pgNum % 5
    }
    // 可以更换的啤酒总数
    val swapBeer = pgSwap + kpSwap
    println(s"2、当前啤酒数$beerNum，空瓶和瓶盖换了${swapBeer}瓶啤酒")
    // 全部喝的啤酒
    swapBeer + swap(swapBeer);
  }


}
